{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "MINE-Mutual-Information-Neural-Estimator.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/BenYavor/MA_GAN/blob/master/MINE_Mutual_Information_Neural_Estimator.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "EkWq8Zt_isjR",
        "colab_type": "code",
        "outputId": "72a51d85-86ad-4fe5-9770-012f2a653f42",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 394
        }
      },
      "source": [
        "!pip install tensorflow==2.0.0-beta1\n",
        "\n",
        "import sys\n",
        "assert sys.version_info >= (3, 5)\n",
        "import numpy as np\n",
        "%matplotlib inline\n",
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "mpl.rc('axes', labelsize=14)\n",
        "mpl.rc('xtick', labelsize=12)\n",
        "mpl.rc('ytick', labelsize=12)\n",
        "import tensorflow as tf\n",
        "from tensorflow import keras\n",
        "from tensorflow.keras import layers\n",
        "from sklearn.preprocessing import OneHotEncoder\n",
        "import pandas as pd\n",
        "import tensorflow_probability as tfp\n",
        "import time\n",
        "\n",
        "np.random.seed(42)\n",
        "tf.random.set_seed(42)\n"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Requirement already satisfied: tensorflow==2.0.0-beta1 in /usr/local/lib/python3.6/dist-packages (2.0.0b1)\n",
            "Requirement already satisfied: tb-nightly<1.14.0a20190604,>=1.14.0a20190603 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.14.0a20190603)\n",
            "Requirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (0.1.7)\n",
            "Requirement already satisfied: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (0.2.2)\n",
            "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.1.0)\n",
            "Requirement already satisfied: tf-estimator-nightly<1.14.0.dev2019060502,>=1.14.0.dev2019060501 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.14.0.dev2019060501)\n",
            "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (0.8.1)\n",
            "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (3.10.0)\n",
            "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.1.0)\n",
            "Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (0.33.6)\n",
            "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.11.2)\n",
            "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.12.0)\n",
            "Requirement already satisfied: numpy<2.0,>=1.14.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.16.5)\n",
            "Requirement already satisfied: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.0.8)\n",
            "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (0.8.0)\n",
            "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow==2.0.0-beta1) (1.15.0)\n",
            "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta1) (3.1.1)\n",
            "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta1) (0.16.0)\n",
            "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.6/dist-packages (from tb-nightly<1.14.0a20190604,>=1.14.0a20190603->tensorflow==2.0.0-beta1) (41.2.0)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow==2.0.0-beta1) (2.8.0)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oUypWuZ9jAcV",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#leaky_relu = tf.keras.layers.LeakyReLU()\n",
        "randN_05 = keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)\n",
        "dim_n = 3 # Dim 4+ needs considerable fine-tuning\n",
        "\n",
        "k = 2\n",
        "\n",
        "M = 2**k"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "x81YbgfUjDLE",
        "colab_type": "code",
        "outputId": "d2ab3c82-9c54-4b72-cc33-fc6005ea95bf",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "input_A = keras.layers.Input(shape=[2*dim_n])\n",
        "input_B = keras.layers.Input(shape=[2*dim_n])\n",
        "    \n",
        "transform = keras.models.Sequential([\n",
        "layers.Dense(30, kernel_initializer=randN_05, activation=\"relu\"),\n",
        "keras.layers.Dropout(rate=0.3), # To regularize higher dimensionality\n",
        "layers.Dense(30, kernel_initializer=randN_05, activation=\"relu\"),\n",
        "keras.layers.Dropout(rate=0.3), # To regularize higher dimensionality\n",
        "layers.Dense(1, kernel_initializer=randN_05, activation=None)])\n",
        "\n",
        "output_A = transform(input_A)\n",
        "output_B = transform(input_B)\n",
        "output_C = tf.reduce_mean(output_A) - tf.math.log(tf.reduce_mean(tf.exp(output_B))) # MINE\n",
        "#output_C = tf.reduce_mean(output_A) - tf.reduce_mean(tf.exp(output_B))+1 # MINE-f\n",
        "MI_mod = keras.Model(inputs=[input_A, input_B], outputs=output_C)\n",
        "\n",
        "print(MI_mod.inputs)\n",
        "MI_mod.summary()\n",
        "keras.utils.plot_model(MI_mod, 'Structure_of_MI_estimation.png', show_shapes=True)\n"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[<tf.Tensor 'input_1:0' shape=(None, 6) dtype=float32>, <tf.Tensor 'input_2:0' shape=(None, 6) dtype=float32>]\n",
            "Model: \"model\"\n",
            "__________________________________________________________________________________________________\n",
            "Layer (type)                    Output Shape         Param #     Connected to                     \n",
            "==================================================================================================\n",
            "input_1 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "input_2 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "sequential (Sequential)         (None, 1)            1171        input_1[0][0]                    \n",
            "                                                                 input_2[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Exp (TensorFlowOpLa [(None, 1)]          0           sequential[1][0]                 \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Mean_1 (TensorFlowO [()]                 0           tf_op_layer_Exp[0][0]            \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Mean (TensorFlowOpL [()]                 0           sequential[0][0]                 \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Log (TensorFlowOpLa [()]                 0           tf_op_layer_Mean_1[0][0]         \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_sub (TensorFlowOpLa [()]                 0           tf_op_layer_Mean[0][0]           \n",
            "                                                                 tf_op_layer_Log[0][0]            \n",
            "==================================================================================================\n",
            "Total params: 1,171\n",
            "Trainable params: 1,171\n",
            "Non-trainable params: 0\n",
            "__________________________________________________________________________________________________\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\nISIiksDNmzfRv39/bNu2Dbt27cLmzZuhra0tdSxSY1paWggICMDJkydx8+ZN2NvbIzw8XOpYRERE\n9RqLIkRERHXs22+/RdeuXVFUVISffvoJ7u7uUkeiBqRXr15IS0vD9OnT4ePjg7Fjx+Lu3btSxyIi\nIqqXWBQhIiKqI6WlpQgICICbmxtGjx6NkydPclJMqhVyuRwhISE4duwYfvnlFzg4OGDfvn1SxyIi\nIqp3WBQhIiKqA7dv38aAAQOwfv16fP7559i+fTv09PSkjkUNXL9+/ZCeng43NzeMGTMG06ZNw9On\nT6WORUREVG+wKEJERFTLjh07BkdHR9y/fx8pKSmYOXOm1JGoETE0NMTmzZuxe/duHDhwAI6Ojvjp\np5+kjkVERFQvsChCRERUS4QQCAoKwptvvolBgwYhNTUV9vb2UseiRmrChAn45Zdf0K5dO/Tu3RsB\nAQEoKyuTOhYREZGkZIIL2RMREanc/fv3MXXqVCQkJCAoKAi+vr5SRyIC8GexLjQ0FIsXL0b37t3x\n1VdfwcbGRupYREREUojmnSJEREQqduLECXTp0gW//fYbjh8/zoII1SsymQy+vr746aefkJ+fryiM\nEBERNUYsihAREamIEAKffPIJBg8ejB49eiA9PR29evWSOhZRld544w0kJyfDx8cHXl5emDRpEh4+\nfCh1LCIiojrFx2eIiIhUICcnBzNnzkRsbCyWLVuGDz74AE2a8G8PpB6OHDmCt99+G5qamti+fTv6\n9+8vdSQiIqK6wMdniIiIXlVaWhq6d++O06dP49ixYwgICGBBhNTKkCFDcO7cOXTv3h0DBw6Er68v\niouLpY5FRERU6/gvNiIiolewfft2uLi4wMrKCqmpqXBxcZE6EtFLadasGfbu3Ytt27bhiy++gKOj\nI86fPy91LCIiolrFoggREdFLyMvLg6enJ7y8vDBv3jx8//33sLCwkDoW0SubNm0afv75ZxgZGaFX\nr1745JNPwKetiYiooeKcIkRERDV08eJFuLu7448//sBXX32F4cOHSx2JSOVKS0sRGBiIwMBADBky\nBBEREbC0tJQ6FhERkSpxThEiIqKa2LFjBxwdHSGXy5GamsqCCDVYmpqaCAgIQEJCAi5duoRu3brh\n8OHDUsciIiJSKRZFiIiI/t/69euRlJRU5b7CwkL4+vpi2rRpmDlzJk6ePIk2bdrUcUKiuufi4oJz\n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\nSUVORK5CYII=\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 3
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "E6C69Kzzi4cZ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def loss_func(inp, outp):\n",
        "  return -outp\n",
        "    #'''Calculate the loss: scaled negative estimated mutual information'''\n",
        "    "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PA9p9oXcjIa4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "MI_mod.compile( loss= loss_func, optimizer=tf.keras.optimizers.Nadam(lr=0.001))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "l75z0TB6jKOV",
        "colab_type": "code",
        "outputId": "33613f89-d80b-47a9-c0b2-9ae20152ce39",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 53
        }
      },
      "source": [
        "SIGNAL_NOISE = 0.2\n",
        "SAMPLE_SIZE = dim_n*6000\n",
        "SIGNAL_POWER = 3\n",
        "\n",
        "x_sample = np.random.normal(0., np.sqrt(SIGNAL_POWER), [SAMPLE_SIZE, dim_n])\n",
        "y_sample = x_sample + np.random.normal(0., np.sqrt(SIGNAL_NOISE), [SAMPLE_SIZE, dim_n])\n",
        "\n",
        "x_sample1, x_sample2 = tf.split(x_sample, num_or_size_splits=2)\n",
        "y_sample1, y_sample2 = tf.split(y_sample, num_or_size_splits=2)\n",
        "joint_sample = tf.concat([x_sample1, y_sample1], axis=1)\n",
        "marg_sample = tf.concat([x_sample2, y_sample1], axis=1)\n",
        "\n",
        "print(x_sample.shape)\n",
        "print(joint_sample.shape)"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "(18000, 3)\n",
            "(9000, 6)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9yqE4rYojNw_",
        "colab_type": "code",
        "outputId": "5a0f2a1f-93e2-463e-acf3-9d8a5e9c7fde",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "\n",
        "\n",
        "history_mi = MI_mod.fit((joint_sample, marg_sample), x_sample, epochs=30, batch_size=200)\n",
        "\n",
        "\n"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Train on 9000 samples\n",
            "Epoch 1/30\n",
            "9000/9000 [==============================] - 0s 41us/sample - loss: -0.0505\n",
            "Epoch 2/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -0.7593\n",
            "Epoch 3/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -2.0280\n",
            "Epoch 4/30\n",
            "9000/9000 [==============================] - 0s 12us/sample - loss: -2.6970\n",
            "Epoch 5/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.0711\n",
            "Epoch 6/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.2429\n",
            "Epoch 7/30\n",
            "9000/9000 [==============================] - 0s 13us/sample - loss: -3.4707\n",
            "Epoch 8/30\n",
            "9000/9000 [==============================] - 0s 12us/sample - loss: -3.5316\n",
            "Epoch 9/30\n",
            "9000/9000 [==============================] - 0s 12us/sample - loss: -3.5812\n",
            "Epoch 10/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.5555\n",
            "Epoch 11/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.6633\n",
            "Epoch 12/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.7998\n",
            "Epoch 13/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.5866\n",
            "Epoch 14/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.8031\n",
            "Epoch 15/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.0751\n",
            "Epoch 16/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.9196\n",
            "Epoch 17/30\n",
            "9000/9000 [==============================] - 0s 12us/sample - loss: -3.8647\n",
            "Epoch 18/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.6296\n",
            "Epoch 19/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.7876\n",
            "Epoch 20/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.8219\n",
            "Epoch 21/30\n",
            "9000/9000 [==============================] - 0s 12us/sample - loss: -3.8013\n",
            "Epoch 22/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.0288\n",
            "Epoch 23/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.9862\n",
            "Epoch 24/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.0015\n",
            "Epoch 25/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.9593\n",
            "Epoch 26/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.0978\n",
            "Epoch 27/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.0426\n",
            "Epoch 28/30\n",
            "9000/9000 [==============================] - 0s 13us/sample - loss: -3.8333\n",
            "Epoch 29/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -3.9445\n",
            "Epoch 30/30\n",
            "9000/9000 [==============================] - 0s 11us/sample - loss: -4.1052\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YMwTXx4qjQgY",
        "colab_type": "code",
        "outputId": "a904e9ce-8c33-41e0-e901-e9405359818a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 73
        }
      },
      "source": [
        "def theoretic_mutual_information(power,noise):\n",
        "    return dim_n*0.5*np.log2(1 + power/noise)\n",
        "\n",
        "\n",
        "df_mi = np.log2(np.exp(1))*np.abs(pd.DataFrame(history_mi.history)) # scaling from Nats to Bits\n",
        "df_mi = df_mi.rename(columns={'loss': 'Approximated mutual information'})\n",
        "history_range = range(len(df_mi))\n",
        "\n",
        "true_mi = [theoretic_mutual_information(SIGNAL_POWER, SIGNAL_NOISE) for x in history_range]\n",
        "\n",
        "print(history_mi.epoch)\n",
        "print(history_mi.history)\n",
        "#plt.plot(history_mi.epoch, history_mi.params.loss)"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]\n",
            "{'loss': [-0.05053745020284421, -0.7593323922819561, -2.0279572751786974, -2.697048102484809, -3.0710621621873644, -3.2429083665211995, -3.4707227918836807, -3.5316464053259957, -3.5811855024761625, -3.5555029180314808, -3.6633349577585856, -3.7998045497470434, -3.5866214301851063, -3.803095812267727, -4.075056680043539, -3.9195960919062296, -3.864746403694153, -3.629632184240553, -3.7875672340393067, -3.8219474183188544, -3.80128280321757, -4.028766669167412, -3.9861906184090508, -4.001496765348646, -3.959264209535387, -4.097799142201741, -4.04257690111796, -3.8333067708545263, -3.944495685895284, -4.105158509148492]}\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "afmRKoJ8jTGx",
        "colab_type": "code",
        "outputId": "5278865f-460a-450c-cfea-eabad6bc41fc",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 328
        }
      },
      "source": [
        "df_mi.plot(figsize=(8, 5))\n",
        "plt.plot(history_range, true_mi, label='Theoretical mutual information')\n",
        "plt.grid(True)\n",
        "plt.gca().set_ylim(0, dim_n*3)\n",
        "plt.legend()\n",
        "#plt.tick_params(axis='x', colors='white')\n",
        "#plt.tick_params(axis='y', colors='white')\n",
        "plt.show()"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAd8AAAE3CAYAAADrF0u3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xd8VFX+//HXSSGdACGE3iGUBAKh\nKFJCtaNY1sKq6CoLdl1xdX8WbLvrit1VV0VA5atiQZF1rRDKilIUUFpooRNCIJDe5vz+mDBLC5mB\nZCbJvJ+PxzxIZu6985mTS945t5xjrLWIiIiI9wT4ugARERF/o/AVERHxMoWviIiIlyl8RUREvEzh\nKyIi4mUKXxERES9T+IqIiHiZW+FrjOlqjJlnjDlkjNlkjBlT3YWJiIjUVZWGrzEmCPgcmAs0AsYD\n7xljOldzbSIiInWSqWyEK2NMAvAjEGXLFzbGfAP8ZK19uPpLFBERqVtO95yvARKqshARERF/EeTG\nMhuAfcAkY8zzwFBgCDD/+AWNMeNxHpYmNDQ0uXXr1lVYat3ncDgICNA1cJ5Qm3lObeY5tZnn/LHN\n0tLS9ltrY91ZttLDzgDGmB7Ayzh7u8uBTKDIWvuHitaJj4+3GzZscK9iASA1NZWUlBRfl1GrqM08\npzbznNrMc/7YZsaYFdbaPu4s607PF2vtapy93SNv8AMw4/TKExER8W/u3mrUwxgTaowJN8bcBzQD\npldrZSIiInWUuwfkrwP24Dz3OxwYaa0tqraqRERE6jB3DztPAiZVcy0i4iMlJSXs3LmTwsJCX5dS\nI0VHR7Nu3Tpfl1Gr1OU2Cw0NpWXLlgQHB5/2NtwKXxGp23bu3ElUVBRt27bFGOPrcmqcnJwcoqKi\nfF1GrVJX28xaS1ZWFjt37qRdu3anvR3/ug5cRE6qsLCQmJgYBa9IJYwxxMTEnPFRIoWviAAoeEXc\nVBX/VxS+IlJjfPbZZxhjWL9+vU/reOSRR/juu+/OeDvZ2dm8+uqrHq83efJkpkyZcsbvf7zPPvuM\ntWvXnvb66enpJCScOLjh7t27ueKKKypd/6OPPqJr164MHTr0tGvwVGpqKj/88IPr+9dff5133nnH\na+9fEYWviNQY77//PgMHDuT999+vsm2WlpZ6vM7jjz/OiBEjzvi9Tzd8q8uZhm9Fmjdvzscff1zp\nclOnTuXNN99k/vwTBkg8qdP52R3v+PCdMGEC119//Rlv90wpfEWkRsjNzWXx4sVMnTqVDz74wPV8\namoqgwcP5sILLyQ+Pp4JEybgcDgAiIyM5J577qF79+4MHz6czMxMAFJSUrj77rvp06cPL774Iunp\n6QwbNowePXowfPhwtm/fDsAll1zi6gX961//YuzYsQCMGzfOFSZt27Zl8uTJJCUl0adPH37++WfO\nPfdcOnTowOuvv+6qffjw4fTu3ZvExEQ+//xzAB544AE2b95MUlISkyY5bxh55pln6Nu3Lz169ODR\nRx91fc6nnnqKzp07M3DgQCoaHXDcuHFMnDiRs846i/bt25OamspNN91E165dGTdunGu5yMhI19cf\nf/wx48aN44cffmDOnDlMmjSJpKQkNm/eTEpKCsuXLwdg//79tG3bFnD2cAcNGkTv3r3p3bv3MeF1\nMkf3iKdPn85ll13GmDFj6NSpE/fffz/g/INm8eLF/OEPf2DSpEkUFhZy4403kpiYSK9evVyBPH36\ndEaPHs2wYcMYPnw4qampDBkyhEsuuYT27dvzwAMPMHPmTPr160diYiKbN28G4IsvvqB///706tWL\nESNGkJGRQXp6Oq+//jrPP/88SUlJLFq06JijCitXruSss86iR48ejBkzhoMHD7r2nz//+c/069eP\nzp07s2jRolN+/tNira2WR+fOna14Zv78+b4uodZRm3nuZG22du1a7xdynPfee8/edNNN1lprzz77\nbLt8+XJrrbPekJAQu3nzZltaWmpHjBhhP/roI2uttYB97733rLXWPvbYY/a2226z1lo7ZMgQO3Hi\nRNe2L7roIjt9+nRrrbVTp061l1xyibXW2r1799oOHTrYhQsX2k6dOtmsrCxrrbU33HCD6z3atGlj\nn3vuOWuttXfffbdNTEy0hw8ftvv27bNNmjSx1lpbUlJiDx06ZK21NjMz03bo0ME6HA67detW2717\nd1cdX3/9tb3lllusw+GwZWVl9sILL7QLFiywy5cvtwkJCTYvL88eOnTIdujQwT7zzDMntNENN9xg\nr7rqKutwOOxnn31mo6Ki7OrVq21ZWZnt3bu3/eWXX6y11kZERLjW+eijj+wNN9xwwuc60k7Lli1z\n1d2mTRtrrbV5eXm2oKDAWmttWlqaTU5OttbaEz7PEUc/P23aNNuuXTu7Y8cOW1BQYFu3bm23b99+\nwvtNmTLF3njjjdZaa9etW2dbtWplCwoK7LRp02yLFi1cP4v58+fb6Ohou3v3bltYWGibN29uH3nk\nEWuttS+88IK96667rLXWHjhwwDocDmuttW+++aa99957rbXWPvroo8e05dHfJyYm2tTUVGuttQ8/\n/LBrW0OGDHGt/+9//9sOHz78hM98sv8zwHLrZkbqViMROcZjX6xh7e7DVbrNbs3r8+jF3U+5zPvv\nv89dd90FwNVXX837779PcnIyAP369aN9+/YAXHPNNSxevJgrrriCgIAArrrqKgB+//vfc9lll7m2\nd+R5gCVLlvDpp58CcN1117l6Y3FxcTz++OMMHTqU2bNn06hRo5PWdsEFFwCQmJhIbm4uUVFRREVF\nERISQnZ2NhEREfzlL39h4cKFBAQEsGvXLjIyMk7YzjfffMM333xDr169AGePeePGjeTk5DBmzBjC\nw8MBGD16dIXtdPHFF2OMITExkbi4OBITEwHo3r076enpJCUlnbKd3VFSUsLtt9/OypUrCQwMJC0t\nzaP1hw8fTnR0NKGhoXTr1o1t27bRqlWrY5ZZvHgxd9xxBwBdunShTZs2rvcZOXLkMT+Lvn370qxZ\nMwA6dOjAqFGjAOfP40iPeefOnVx11VXs2bOH4uLiSm8DOnToENnZ2QwZ4hw5+YYbbuDKK690vX5k\nX0pOTiY9Pd2jz+8Oha+I+NyBAweYN28ev/76K8YYysrKMMbwzDPPACdeXVrR1aZHPx8REeHWe//6\n66/ExMSwe/fuCpcJCQkBICAgwPX1ke9LS0uZOXMmmZmZrFixguDgYNq2bXvSW1GstTz44IP88Y9/\nPOb5F154wa1a3akFjm2HU90SExQU5DqEf/Ryzz//PHFxcaxatQqHw0FoaKjb9R1dI0BgYKDH526P\n/9kd/zmPboMj277jjju49957GT16NKmpqUyePNmj9zzekfc4nfrdofAVkWNU1kOtDh9//DHXXXcd\n//rXv1zPDRkyxHWubenSpWzdupU2bdrw4YcfMn78eMA5bd3HH3/M1Vdfzf/93/8xcODAk25/wIAB\nfPDBB1x33XXMnDmTQYMGubb7n//8h19++YUhQ4YwatSo0xo44dChQzRp0oTg4GDmz5/Ptm3bAIiK\niiInJ8e13LnnnsvDDz/M2LFjiYyMZNeuXQQHBzN48GDGjRvHgw8+SGlpKV988cUJAe2JuLg41q1b\nR3x8PLNnz3YNdnF8PW3btmXFihX069fvmAumDh06RMuWLQkICGDGjBmUlZWddi0VGTRoEDNnzmTY\nsGGkpaWxfft24uPj+fnnn09re4cOHaJFixYAzJjxv3l/oqKiOHz4xCM50dHRNGzYkEWLFjFo0CDe\nffddVy/YG3TBlYj43Pvvv8+YMWOOee7yyy93XfXct29fbr/9drp27Uq7du1cy0ZERLB06VISEhKY\nN28ejzzyyEm3//LLLzNt2jR69OjBu+++y4svvkhRURG33HILb7/9Ns2bN+fZZ5/lpptuwroxzerx\nxo4dy/Lly0lMTOSdd96hS5cuAMTExHDOOeeQkJDApEmTGDVqFNdeey1nn302iYmJXHHFFeTk5NC7\nd2+uuuoqevbsyfnnn0/fvn09ruFof//737nooosYMGCA63AtOA/nP/PMM/Tq1YvNmzdz33338dpr\nr9GrVy/279/vWu7WW29lxowZ9OzZk/Xr17t9FMETt956Kw6Hg8TERK666iqmT59+TA/XU5MnT+bK\nK68kOTmZxo0bu56/+OKLmT17tuuCq6PNmDGDSZMm0aNHD1auXFnh/lMd3JrP93RoPl/P+eP8l2dK\nbea5k7XZunXr6Nq1q28KqkRqaipTpkxh7ty5J7wWGRlJbm5utddQV4dKrE51vc1O9n/Gk/l81fMV\nERHxMp3zFZEaLSUlpcKjG97o9YpUB/V8RUREvEzhKyIi4mUKXxERES9T+IqIiHiZwldEfC4rK4uk\npCSSkpJo2rQpLVq0ICkpiQYNGtCtWzev1rJy5Uq+/PJL1/dz5szhueeeO61ttW3b9pj7Z6vKX//6\n1zNav6IpC92dbu+aa66hR48ePP/882dUhydeeOEF8vPzXd9fcMEFZGdne+39q5qudhYRn4uJiWHl\nypWAMxgiIyO57777SE9P56KLLqry9ystLSUo6OS//lauXMny5ctd4zmPHj3aq/PPuuOvf/0rf/nL\nX6p8uxMmTKh0mb1797Js2TI2bdrk9nZP1d7ueuGFF/j973/vGv/66D+QaiO3er7GmLbGmC+NMQeN\nMXuNMa8YYxTcIlLtysrKuOWWW+jevTujRo2ioKAAgM2bN3PeeeeRnJzMoEGDWL9+PUCF0weOGzeO\nCRMm0L9/f+6//37y8vK46aab6NevH7169eLzzz+nuLiYRx55hA8//JCkpCQ+/PBDpk+fzp/+9CcA\nMjIyGDNmDD179qRnz56uqfYuvfRSkpOT6d69O2+88UalnykyMpJJkybRvXt3RowYwdKlS0lJSaF9\n+/bMmTMHcE6td/vtt7vWueiii0hNTeWBBx6goKCApKQkxo4de8IE91OmTHGNa/zmm2/St29fevbs\nyeWXX35Mz/Fkju4RVzSt3qhRo9i1a5drxKiKpuW74IILjpnW0d3pECdOnEifPn3o3r27a8rFl156\nid27dzN06FDXH0JHH1V47rnnSEhIICEhwTVOdnp6Ol27dj3pvlMTuHvY+VVgH9AMSAKGALdWV1Ei\nIkds3LiR2267jTVr1tCgQQM++eQTAMaPH8/LL7/MihUrmDJlCrfe6vyVdMcdd3DDDTewevVqxo4d\ny5133una1s6dO/nhhx947rnneOqppxg2bBhLly5l/vz5TJo0iZKSEh5//HGuuuoqVq5ceczMSAB3\n3nknQ4YMYdWqVfz888907+4cB/vtt99mxYoVLF++nJdeeomsrKxTfqa8vDyGDRvGmjVriIqK4qGH\nHuLbb79l9uzZlQ5x+Pe//52wsDBWrlzJzJkzT7nsZZddxrJly1i1ahVdu3Zl6tSpp1z+eKWlpSxd\nupQXXniBxx57DHAehu/QoQMrV65k0KBBXH/99Tz99NOsXr2axMRE13IAxcXFLF++3PXHy8GDB1my\nZAnPP/88o0eP5p577mHNmjX8+uuvriMfTz31FMuXL2f16tUsWLCA1atXc+edd9K8eXPmz5/vmsXo\niBUrVjBt2jR++uknfvzxR958801++eUXoOJ9pyZwt/faDnjFWlsI7DXGfAV4f/R1Eal+/3kA9v5a\ntdtsmgjn//20Vm3Xrp1rmrwj07vl5ubyww8/HDMFXFFREVDx9IEAV155JYGBgYBzer85c+a4enqF\nhYWuXnJF5s2b5zonGhgYSHR0NODsmc2ePRuAHTt2sHHjRmJiYircTr169TjvvPMA57R4ISEhBAcH\nk5iYWKXT1/3222889NBDZGdnk5uby7nnnuvR+pVNq1fZtHzH//HiznSIs2bN4o033qC0tJQ9e/aw\ndu1aevToUWGNixcvZsyYMa7xpy+77DIWLVrE6NGjT7rv1BTuhu8LwNXGmFSgIXA+8HB1FSUicsTx\n09MVFBTgcDho0KCBq7fkrqMnCLDW8sknnxAfH3/MMj/99JNH20xNTeW7775jyZIlhIeHk5KScspp\n/ACCg4Nd0/5VNEXe0dP9QcVTA55quXHjxvHZZ5/Rs2dPpk+fTmpqqkef7Uyn1atoasCKpkPcunUr\nU6ZMYdmyZTRs2JBx48ZV2pbu1A//23dqCnfDdyEwHjgMBAIzgM+OX8gYM758OWJjYz3+Qfu73Nxc\ntZmH1GaeO1mbRUdH/2+quYH/r3re+Kip7E6lqKiI4OBgcnJyyM3NxeFwuGorKiqiqKgIYwytW7fm\nnXfeYcyYMVhr+e2330hMTKRfv35MmzaNa665hpkzZ3L22WeTk5NDSUkJBQUFrm0NHTqUZ599lilT\npmCMYdWqVfTs2ZOgoCAOHDjgWq6wsBBrLTk5OQwePJjnn3+e2267jbKyMnJzc9m7dy9RUVGUlZWx\nYsUKfvzxR/Lz88nJycFaS25u7kln6zn6Mx35vEe/1qRJE1asWMGhQ4fYvXs3S5cudW03ODiYAwcO\nEBwcTHh4OBkZGaSnpxMZGcnnn3/OiBEjyMnJ4fDhw0RFRXHgwAHeeecdmjVrRk5Ozknf8/haysrK\nyMvLc/0cjrTB0T+TgIAAoqOj+frrrxkwYABvvfWWq72tta71gWPa//if65HX9uzZQ1hYGAEBAWze\nvJkvv/ySs846i5ycHCIiItizZ4+rLY+0be/evZk4cSK33Xab6w+qN954o8J95/jPfLoKCwvP6HdP\npeFrjAkAvgLeAAYAkcDbwNPA/Ucva619o3w54uPjrWab8Yxm6PGc2sxzFc1qVFNmoAkJCSEkJISo\nqCgiIyMJCAhw1RYSEkJJSQlRUVF88MEHTJw4kWeffZaSkhKuvvpqBgwYwGuvvcaNN97IK6+8Qmxs\nLNOmTSMqKorg4GDCwsJc23riiSe4++67Oeecc3A4HLRr1465c+dywQUX8OKLLzJo0CAefPBBQkND\nMcYQFRXFq6++yvjx45k5cyaBgYG89tprjBkzhhkzZtCvXz/i4+M566yzCA8PJyoqCmMMkZGRJ23b\noz/Tkc979GsjR45kxowZ9O/fn65du9K7d2/XdsePH88555xD7969mTlzJo8++ijDhw+nRYsWdO/e\n3bW9J598kuHDhxMbG0v//v1dMw2d7D2PryUwMJCIiAiioqJcf/Cc7Gfy7rvvMmHCBPLz82nfvr2r\nvY0xrvWBY9r/+G0ceW3AgAEkJyfTt29fWrVqxcCBAwkNDSUqKooJEyZwxRVXuM79HmnbQYMGcdNN\nNzF8+HDAeS3AwIEDSU9Pr3DfqQqhoaH06tXrtNevdEpBY0xjIBNoYK09VP7cpcCT1tqEitbTlIKe\nU5B4Tm3mudo2pWBNUNenx6sOdb3Nqn1KQWvtfmArMNEYE2SMaQDcAKw+jXpFRET8nru3Gl0GnIez\nB7wJKAHuqa6iRERE6jK3Lriy1q4EUqq3FBEREf+gsZ1FBHBePSoilauK/ysKXxEhNDSUrKwsBbBI\nJay1ZGVlERoaekbb0fjMIkLLli3ZuXMnmZmZvi6lRiosLDzjX7b+pi63WWhoKC1btjyjbSh8RYTg\n4GDatWvn6zJqrNTU1DO6p9Mfqc1OTYedRUREvEzhKyIi4mUKXxERES9T+IqIiHiZwldERMTLFL4i\nIiJepvAVERHxMoWviIiIlyl8RUREvEzhKyIi4mUKXxERES9T+IqIiHiZwldERMTLFL4iIiJepvAV\nERHxMoWviIiIlyl8RUREvKzS8DXG5B73KDPGvOyN4kREROqioMoWsNZGHvnaGBMJ7AU+qs6iRERE\n6jJPDztfDuwDFlVDLSIiIn7BWGvdX9iYecBCa+3kCl4fD4wHiI2NTZ41a1ZV1Og3cnNziYyMrHxB\ncVGbeU5t5jm1mef8sc2GDh26wlrbx51l3Q5fY0wbYAvQ0Vq7tbLl4+Pj7YYNG9zatjilpqaSkpLi\n6zJqFbWZ59RmnlObec4f28wY43b4enLY+TpgsTvBKyIiIhXzJHyvB2ZUVyEiIiL+wq3wNcYMAFqg\nq5xFRETOmLs93xuAT621OdVZjIiIiD+o9D5fAGvtH6u7EBEREX+h4SVFRES8TOErIiLiZQpfERER\nL1P4ioiIeJnCV0RExMsUviIiIl6m8BUREfEyha+IiIiXKXxFRES8TOErIiLiZQpfERERL1P4ioiI\neJnCV0RExMsUviIiIl6m8BUREfEyha+IiIiXKXxFRES8TOErIiLiZQpfERERL1P4ioiIeJnb4WuM\nudoYs84Yk2eM2WyMGVSdhYmIiNRVQe4sZIwZCTwNXAUsBZpVZ1EiIiJ1mVvhCzwGPG6t/bH8+13V\nVI+IiEidV2n4GmMCgT7AHGPMJiAU+AyYZK0tqGi98PxdMO3CKivUHyRlZ8PWBr4uo1ZRm3lObeY5\ntZnn1Gan5k7PNw4IBq4ABgElwOfAQ8D/O3pBY8x4YDxAQtMQsrOzq7TYuq6srExt5iG1mefUZp5T\nm3lObXZqxlp76gWMaQgcAMZZa2eUP3c58JC1tldF68XHx9sNGzZUZa11XmpqKikpKb4uo1ZRm3lO\nbeY5tZn7DuQV85/f9rBpYxoXDkymQ2wkDSPq+bqsapWVW8S7P27jnpHxK6y1fdxZp9Ker7X2oDFm\nJ3B0Sp86sUWkWmTlFvHt2gzO6diYVo3CfV2OCAAOh2XJlizeX7qdb9ZkUFzmAGDab0sAaBRRjw6x\nEXSIjXQ+mji/btkwnMAA48vSz8jW/Xm8tWgLH6/YSVGpw6N13b3gahpwhzHmK5yHne8B5npWpoic\niZ+3H+S2mT+z51AhAQbOS2jKHwa2o3frhhhTe3+BSe2VcbiQj5bv4MPlO9hxoID6oUFc2781v+vT\nit9WLie2fQKbM3Odj315fLs2gw/ydrjWrxcYQLvGEa4wPvLo2CSSsHqBPvxkp7Zi2wHeWLiFb9Zm\nEBwYwOW9W/CHge3p9LT723A3fJ8AGgNpQCEwC3jK04JFxHPWWmb8kM5TX66jaXQo02/sy49bDvD+\n0u18+eteeraM5qaB7bggsRnBgRo3pyZZu/swP2zeT9PoUFo0CKNFwzBiI0Nq9R9LpWUOUjdk8sGy\n7cxbvw+HhbPaN+K+UfGc270pocHO0NyXFkBKlyYM7dLkmPUP5hWzZb8zjI8E87o9OXz1214c5cdU\n64cGcd+58VzbrzVBNWSfLnNYvl2bwRsLN/Pz9mwahAdz+9COXH92W2KjQjzenlvha60tAW4tf4iI\nl+QVlfLnT1Yzd/UeRnRtwrNXJhEdHkxKfBPuHN6RT37exbTFW7nrg5X87cv1XD+gDdf2a02D8Lp9\njq2mKywp44XvNvLmoi2UOY49S1cvKMAZxA3CaN4glBYNwmnR0Pl9y4ZhNI0O9eiPqNIyB/klZeQX\nlZFfXEp+cRkFJWXkF5cRGhRAi4ZhNK0fesYhtj0rn1nLd/DRih1kHC6icWQIfxzSgd/1aUW7xhFu\nb6dhRD2SIxqR3KbRMc8XlZaxPSufTftyee+nbTzy+Rr+76ftPH5JAv3aNapga9WvsKSMj1fsZOri\nrWzdn0erRmE8Nro7V/ZpSXg9d/uvJzr9NUWkWm3MyGHCeyvYuj+P+8+LZ8LgDgQcdX4svF4Q153V\nhrH9WpOato+3F6fzj6828PL3m7g8uQU3ntOODrGRPvwE/unHLVk8+OmvbN2fx+/6tOSuEZ05XFDC\nroMF7Mouf5R/PX9DJpk5RcesbwzERYU6QzM6FIfDOgO1uIz8ktL/fV3+75Hzq6cSYKBpfec2m5cH\n/5GvWzZw/hsRcmIcFJWW8c2aDD5Ytp3/bsoiwEBKfBMev6QVw7o0qdIjLSFBgXSKi6JTXBTnJTTl\nq9/28sTctfzuX0u4NKk5D17Qlbj6oVX2fpXJyi3inSXbePfHbRzIK6Zny2j+eW1vzktoWiXnqRW+\nIjXQ5yt38eCnvxJeL5D3bu7PgA6NK1w2IMAwrEscw7rEsX7vYd5evJVZy3fy3o/bGRofy00D2zGw\nY+NafaizNjhcWMLfvlzP+0u307pRODNv7s85HZ0/txYNwujarP5J1yssKWPPoUJ2HSxgd3YBO13h\nnM/a3YcJDDCE1wskLDiQ2MgQwusFEVYv0PlcvUDCg4MIrxdIeEj5c0e+rxdIfnEZu7Kd29110Lnt\nFdsO8u/Veyg9rkfeIDy4vDfuDGeHtXyxajcH80to0SCMe0d25orkljRvEFbtbWmM4fzEZqTEN+HV\n1E38a+EWvl2bwZ3DO3HjOe2oF1R9h6KPv4hqRNcm3DKoPf3aNarS/0MKX5EapKi0jKf+vY53lmyj\nT5uG/HNsb4/+2u/StD7/uKIn95/XhZk/bufdH7dx3dSlxMdFcdPAtlyS1KIaq/df36zZy8Of/0Zm\nThG3DGrHvSPj3b5gKDQ4kHaNIzw6dHumyhyWfTmFJ/TGd2cXsC0rjx827ae4zMGobk25qm8rBnZs\nfMxRF28JqxfIn0bFc0VyS56Yu5a//Wc9Hy7fweSLuzO4c2yVvU9mThHfr8vgqzV7WZCWSXBAAJf1\nbsHNg9rRsUlUlb3P0RS+IjXEruwCbp35M6t2ZHPzwHb8+fwup31Yr3FkCHeN6MSElPZ8sWoPUxdv\n5c+f/MrTX22gS7SDNXYTHWIjaB8bSZuYcEKCau6VpTXZvpxCJs9Zw5e/7qVL0yjeuK4PPVvV/FGd\nAgMMzaLDaBYdxsluSrXWUuawNeZipzYxEbx1Q1/mr9/HY1+s4fq3l3Ju9zgeurDbad9ytz0rn6/X\n7OWbtXtZvu0g1kLLhmHcltKR6we0oUlU9R7iVviK1AAL0jK5+4NfKCmzvDa2N+cnVs3cJSFBgVyR\n3JLLe7fgxy0HeGdJOj9tyuCHr/83AE6AgdaNwukQG0n7I/diNnHe8tGojg+OcLqstXy0YidP/Xsd\nBcVlTDo3nvGD29eZq82NMQQF1rzTFEO7NGFAxxjeWrSVV+ZtYsSGBUxM6cCEIR1cV1lXxFrL2j2H\n+XpNBt+s2cv6vTkAdG1WnzuHdeLc7k3p2izKa6dnFL4iPuRwWF6at5EXv99IfFwUr47tTftquEjK\nGMPZHWI4u0MMqamp9D17IFvOBvOBAAAeb0lEQVT3H7nVo/zffbks3rT/mMECGoQHl9976ewl92rV\ngP7tY6q8vtpke1Y+f5n9K4s37adv24b87bIedGyiC9u8JSQokNuGdmRMrxY89eU6XvhuIx+v2Mkj\nF3VjZLe4Y8KzzGFZln6Ab9Zk8M3avew8WIAx0LdNIx66sCujujWldYxvBqtR+Ir4yIG8Yu7+cCUL\n0zK5rHcLnro00WsDC0SEBJHQIpqEFtHHPF/msOzOLjghlOetz2TW8p0AXNyzOY+N7u53veIyh2Xa\nf7fy7DdpBAYYnrg0gbH9WvvkXKhA8wZh/PPa3oztv5/Jc9Yw/t0VDO4cy4Pnd2HXwQK+WbuX79bt\n40BeMfWCAhjYsTF3DOvI8K5xNI70/L7cqqbwFfGBlTuyufW9FezPLeavYxK5pl+rGnE1cmCAoVWj\ncFo1Cicl/tjXDhWUMP2/6bw8byNLNu/nyUsTOC+h5k3tXeawZOUVse9wEZk5RezLKSQ7v4TwkCDq\nhwYRFRpEVGiw69/IkCCiQoJOGaI7chxc9up/WbXzEMO7NOGJSxO8ctWvVG5Ah8b8+85BvLtkG89/\nm8b5Ly4CICokiGFdmzCqW1OGxMcSeZJbqXypZlUj4gVHxqHddbCA0UnNKz1XVJVKyxxM+286//h6\nPXH1Q/lk4gASW0ZXvmINEB0WzF0jOjGyWxyTPl7FhPd+9movuKi0rDxMjwRroevrfUe+zikiK7cI\nx2mMPh8ZciSYjw3nAANzVxXQILyMl6/pxUU9mtWIP5Tkf4IDA7hpYDsu7tmcz37ZRXzTKM5qH1Ot\ntySdKYWv+I3d2QV8tHwnH63Ywc6DzqmoX5m/icdGdz9hCLzqsGLbQR767DfW7TnMiK5xTLmyR60c\niapb8/p8dts5vJa6udp7wcWlDuau3s3UxVtZs/vwCa8HGOeV3bFRITSJCiGheTRN6ju/jo0KdX3d\nILwe+cWl5BQeeZQc8+/hkzyXlVtM+v48covKOLt5EC/fNKTOz85T28VGhXDL4Pa+LsMtCl+p04pK\ny/hu7T4+XL6DRRszsRbO6RjDpHPjiQ4L5om5a7lx+jJGdovjkYtO/7aFU8nOL+bpr9bz/tIdNK0f\nymtjnaPk1ObeU3BgAHcOd/aC7/vI2Qu+qEczHhvdnZgqOJ+WnV/MzJ+2M+OHdPblFNGpSST3jOhM\n0+gQmkSFOsO2fggxESFujzYUGRLE6d6ymZqaquCVKqXwlTpp/d7DzFq2k9m/7ORgfgnNokO5Y2hH\nruzT6piAHdChMVMXb+Wl7zcy8vkF3D60I7cMbl8l971aa/l4xU7+9p/1HCoo4eaB7bh7ZOcad+7p\nTHRt5uwFv566mZfmbWTJ5iyevDThtG+VSt+fx9v/3cpHy3dSUFLGoE6NeebKngzupBG6pG6pO78F\nxO8dLizhi1W7mbVsB6t2HiI40DCqW1N+Vz5Cz8l6SPWCApiY0oFLkprzxNy1TPkmjU9+3sVjo89s\nBJ20jBwemv0bS9MP0Lt1A54ak1jh8IK1XXBgAHcM78TI7s5e8MSZP3Nhj2Y87mYv2FrLsvSDvLVo\nC9+uyyAowHBJknN0oS5N62abiSh8pVaz1vLTliw+XL6DL3/dQ2GJg/i4KB6+qBtjerVw+0Kg5g3C\neO33ySxIy2TyHOcIOhckNuWhC7t5dFVrfnEpL36/kamLthIZGsTTlydyZXIrv7gdpUvT+sy+9Rz+\ntWAzL36/kR83Z/HEpQlcUEEvuLTMwZe/7WXqoi2s2nnINUXbdWe1oYkXB9AX8QWFr9Q61lo2ZOTw\n7ZoM3vtvARlf/0hUSBCX9W7JVX1a0aNl9GkfohzSOZav7h7Emwu38Mr8Tcxfn8mdwzvxh4GnHszd\nWss3azN4bM4adh8q5Hd9WvLA+V397l7Y4MAAbh/WiZHdmnLfR6u4debPXJjYjMcv+V8v+HBhCR8u\n3cH0H9LZlV1Au8YRPHFpAlf0blmjJ1AXqUoKX6kVSsocLNt6gG/WZvDdugzX1crxDQO4/8IeXJDY\nrMp+cYcEBXL7sE5cktSCx+eu5emv1vPJzzt5fHR3BnQ8cXahHQfymTxnDd+v30eXplG8dE0v+rT1\n3fyjNUF80yg+vXUAbyzcwgvfpbFkSxYPnNeFDRk5fLhsB7lFpfRv14jHRndnWJcmfnFkQORoCl+p\nsQ4VlLAgLZPv1mYwf8M+cgpLCSkfqeb2oR0Z1qUJa3/+kZTkltXy/q0ahfPm9X2Ytz6DR+es4dq3\nfuLins156ELnvKLFpQ7eXLSFl+dtJMAY/t8FXRl3Tts6M77vmQoODOC2oR0Z0dV5X/D9n6wmKMBw\nYY9m3Dywfa25v1mkOih8pUbZcSCf79Y5e7c/bTlAqcMSE1GP8xOaMqJrHAM7NSa83v9227VeqGlY\nlzgGdGjM6ws282rqZuaty+DGc9rx1Zq9bNqXy3ndm/LIxZ6dG/Yn8U2j+HTiABZuzKRL0/pqJxEU\nvuKmQ/klbDuQR3pWPtv2l/+b5fw3v7iUBmHBNAivR4PwYBqW/3vk6+iwo58r/zcsmKDAABwOy6+7\nDvHdugy+XZvhmmmkY5NIbh7UnpHd4khq1cDtezmrS2hwIHeP6MyYXi2YPGcNr8zfRKtGYUwb19cr\nA3TUdkGBAQzrEufrMkRqDIWvAM4Lhg7kFR8Tqkf/m51fcszyTeuH0iYmnOFdmhAZGsShghKy84s5\nmF/C+r2Hyc4vIbughLJTjPMXFRpEgDEcKighwEDfts6ZRoZ3jfPqxOKeaBMTwdvj+rJm92E6Non0\n6tCUIlJ3uBW+xphU4CygtPypXdba+IrXkJrKWsvew4Vs2JvjfGTksDEjl/T9eeQUlbqWCzDO22/a\nxkRwYWIz2sZE0CYmnLaNI2jdKNyt0LHWklNUSnZeCdkFzmDOzi8mO7+Eg+X/FpaU0a9dI4bGN6k1\nIwgZY06YDUhExBOe9Hxvt9a+VW2VSJU7kFfMhr05pGU4QzatPGxzCv8XsnH1Q+gcF8XlyS2d4Voe\nsi0bhp/xoOTGGOqHBlM/NJjW+GbOTBGRmkiHneuAsvLzphv2HmbD3lxX2GbmFLmWiQ4LJj4uikuT\nWtC5aRTxcVF0jouslQP7i4jUdp6E79+MMX8HNgD/z1qbWj0liSc27M3hz5+sZuWObABCgwPoHBfF\nkM6xdGkaRee4KOKbRtEkKkRj44qI1BDG2sonvjTG9Md5V0cxcDXwCpBkrd183HLjgfEAsbGxybNm\nzaryguuy3NxcIiMj3Vq2xGGZu7mEuVtKCA+CyzvXo1tMII3DDAF+FLKetJk4qc08pzbznD+22dCh\nQ1dYa/u4s6xb4XvCSsZ8BfzbWvtyRcvEx8fbDRs2eLxtf5aamkpKSkqly63YdpAHPlnNxn25XJrU\nnEcu9s5k5jWRu20m/6M285zazHP+2GbGGLfD93TP+VrAf7pXNUReUSnPfL2BGUvSaVY/lGk39mVo\nvO4xFRGpbSoNX2NMA6A/sADnrUZXAYOBu6q3NDnagrRM/vLpr+w+VMD1Z7Vh0nld6tS8sCIi/sSd\n397BwJNAF6AMWA9caq1Nq87CxOlgXjFPzF3Lp7/sokNsBB9POJvkNv49aL+ISG1XafhaazOBvl6o\nRY5ireWL1Xt4bM4aDhWUcOewjtw2rCMhQRpRSUSkttNxyxpoz6ECHpr9G9+v30fPltHMvKU/XZrW\n93VZIiJSRRS+NYjDWt79cRtP/2c9pQ4HD13YlRvPaefzSQVERKRqKXxriE37cvn70kLSDv7GwI6N\n+euYRFrHaEhGEZG6SOHrY5v25fDKvE3MWbWb0ED4xxU9uDK5pUajEhGpwxS+PrJ292Femb+R//y2\nl7DgQG4e1J7ugXu5pE8rX5cmIiLVTOHrZSt3ZPPKvI18t24fUSFB3JbSkZsGtqNRRD1SUzN8XZ6I\niHiBwtdLlqUf4KXvN7Jo434ahAdz78jO3DCgLdFhwb4uTUREvEzhW42stfywOYuXvt/IT1sP0Diy\nHg+c34Xfn9VGo1OJiPgxJUA1sNaSuiGTl+Zt5Jft2cTVD+GRi7pxTb/WhNXTIBkiIv5O4VuFHA7L\nN2szeGX+Rn7bdZgWDcJ48tIEruzTUiNTiYiIi8K3iqTvz2PCeytYvzeHtjHh/OOKHozp1YLgwABf\nlyYiIjWMwrcK7M4uYOxbP1FQUsaLVydxYWIzghS6IiJSAYXvGcrMKeL3b/3E4cIS3r/lLBJaRPu6\nJBERqeHUPTsDh/JLuG7qT+w5VMi0cX0VvCIi4haF72nKKypl3PSlbMnM443rk+nTVnPsioiIe3TY\n+TQUlpRxyzvLWb3zEP+8tjeDOsX6uiQREalF1PP1UEmZg9v/72d+2JzFlCt7cF5CU1+XJCIitYzC\n1wNlDsufZq3iu3X7eOLSBMb0aunrkkREpBZS+LrJWstDn/3GnFW7eeD8Llx3VhtflyQiIrWUwtcN\n1lr++uU63l+6nduGdmDCkA6+LklERGoxj8LXGNPJGFNojHmvugqqiV6et4k3F23lhrPbcN+oeF+X\nIyIitZynPd9/Asuqo5CaaurirTz3bRqX927Joxd3xxjj65JERKSWczt8jTFXA9nA99VXTs0ya9kO\nnpi7lvMTmvL05YkEBCh4RUTkzLkVvsaY+sDjwL3VW07NMXf1bh74dDWDO8fywtVJGqtZRESqjLHW\nVr6QMS8Cu621TxtjJgMdrbW/P8ly44HxALGxscmzZs2q4nK9Y1VmKS/9XESHBgH8qU8oIYHe6fHm\n5uYSGRnplfeqK9RmnlObeU5t5jl/bLOhQ4eusNb2cWfZSke4MsYkASOAXpUta619A3gDID4+3qak\npLhTQ42yZHMWr363lG7No5l5S3/qhwZ77b1TU1OpjW3mS2ozz6nNPKc285za7NTcGV4yBWgLbC+/\n2CgSCDTGdLPW9q6+0rxv9c5sbp6xjNaNwplxUz+vBq+IiPgPd8L3DeCDo76/D2cYT6yOgnylzGGZ\n9NFqGoTX472b+9Moop6vSxIRkTqq0vC11uYD+Ue+N8bkAoXW2szqLMzbPl+5iw0ZObx8TS/i6of6\nuhwREanDPJ7VyFo7uRrq8KniUgfPf5dGt2b1uTCxma/LERGROk73zwAfLNvOjgMFTDovXvfyiohI\ntfP78M0vLuWl7zfRr10jUjprXl4REal+fh++0/6bzv7cIv58XryGjhQREa/w6/A9lF/CvxZsZniX\nJiS3aeTrckRExE/4dfi+vnAzOUWl3HeuZioSERHv8dvw3Xe4kGn/3crons3p2qy+r8sRERE/4rfh\n+9K8jZSWWe4d2dnXpYiIiJ/xy/DdlpXHB0t3cHW/VrSJifB1OSIi4mf8Mnyf/zaNoEDDncM6+boU\nERHxQ34Xvuv3HubzVbsZN6AdTTSMpIiI+IDfhe+UrzcQGRLExCEdfF2KiIj4Kb8K3+XpB/hu3T4m\nDOlAdLimCxQREd/wm/C11vKPrzfQODKEG89p6+tyRETEj/lN+C5Iy2Tp1gPcObwj4fU8nsxJRESk\nyvhF+Doclme+3kCrRmFc3be1r8sRERE/5xfh++Vve1iz+zD3jOhMvSC/+MgiIlKD1fkkKi1z8Nw3\naXSOi+SSpBa+LkdERKTuh+/HK3ayZX8e942KJzBAUwaKiIjv1enwLSwp44XvNtKrdQNGdovzdTki\nIiJAHQ/fd5dsY+/hQu4/twvGqNcrIiI1g1vha4x5zxizxxhz2BiTZoy5uboLO1M5hSW8mrqJQZ0a\nc3aHGF+XIyIi4uJuz/dvQFtrbX1gNPCkMSa5+so6c28u2srB/BLuP7eLr0sRERE5hlvha61dY60t\nOvJt+aPGDo6clVvE1EVbuCCxKYkto31djoiIyDHcPudrjHnVGJMPrAf2AF9WW1Vn6J/zN1NQUsa9\nI+N9XYqIiMgJjLXW/YWNCQTOBlKAp621Jce9Ph4YDxAbG5s8a9asqqvUTfsLHDywsIABLYK4KSHE\n6+9/JnJzc4mMjPR1GbWK2sxzajPPqc08549tNnTo0BXW2j7uLOtR+LpWMuZ1YK219qWKlomPj7cb\nNmzweNtnatJHq/h81W5S70uheYMwr7//mUhNTSUlJcXXZdQqajPPqc08pzbznD+2mTHG7fA93VuN\ngqiB53yz84v59JddXNuvda0LXhER8R+Vhq8xpokx5mpjTKQxJtAYcy5wDfB99ZfnmUUb91PmsIxO\nau7rUkRERCrkztx6FpgIvI4zrLcBd1tr51RnYadjYVom0WHB9GzZwNeliIiIVKjS8LXWZgJDvFDL\nGbHWsnBjJgM7NtYYziIiUqPVmeEl0zJyyThcxODOjX1dioiIyCnVmfBdkLYPgMGdY31ciYiIyKnV\nmfBdmLafznGRNIvWVc4iIlKz1YnwzS8uZenWAwzupF6viIjUfHUifH/acoDiMgdD4hW+IiJS89WJ\n8F2QlklocAB92zbydSkiIiKVqhPhu3BjJv3bxRAaHOjrUkRERCpV68N3x4F8tmTm6SpnERGpNWp9\n+C7cmAnAEIWviIjUErU/fNMyadEgjA6xEb4uRURExC21OnxLyhz8sCmLwZ0bY4yGlBQRkdqhVofv\nL9uzySkq1SFnERGpVWp1+C5MyyQwwDCgo8ZzFhGR2qN2h+/GTHq1akD90GBflyIiIuK2Whu+WblF\n/LrrkA45i4hIrVNrw3fxpv1Yq1mMRESk9qm14bsgLZOG4cEktIj2dSkiIiIeqZXh63BYFqbtZ2Cn\nWAIDdIuRiIjULrUyfNftPcz+3CKd7xURkVqpVobvwrT9AAzupFuMRESk9qml4ZtJl6ZRNKkf6utS\nREREPFZp+BpjQowxU40x24wxOcaYlcaY871R3MnkFZWyfNsBhsTrkLOIiNRO7vR8g4AdwBAgGngI\nmGWMaVt9ZVVsyeYsSsosQzopfEVEpHYKqmwBa20eMPmop+YaY7YCyUB69ZRVsYUbMwkLDiS5bUNv\nv7WIiEiVMNZaz1YwJg7YBiRZa9cf99p4YDxAbGxs8qxZs6qqTpf7F+bTLCKAe5Lr3vne3NxcIiMj\nfV1GraI285zazHNqM8/5Y5sNHTp0hbW2jzvLehS+xphg4D/AZmvtH0+1bHx8vN2wYYPb23bHtqw8\nhjyTymOju3PDgLZVuu2aIDU1lZSUFF+XUauozTynNvOc2sxz/thmxhi3w9ftq52NMQHAu0AxcPtp\n1nZGFqZlAhpSUkREardKz/kCGOdM9VOBOOACa21JtVZVgQVpmbRqFEbbmHBfvL2IiEiVcLfn+xrQ\nFbjYWltQjfVUqLjUwZLNWQzpHIvzbwEREZHayZ37fNsAfwSSgL3GmNzyx9hqr+4oK7YdJK+4jMG6\nxUhERGo5d2412gb4vKu5cGMmQQGGszvE+LoUERGRM1JrhpdcsCGT5DYNiQoN9nUpIiIiZ6RWhG9m\nThFr9xzWVc4iIlIn1IrwXbTReYuRphAUEZG6oFaE74K0TGIi6tGtWX1flyIiInLGanz4OhyWRRv3\nM7hzLAEBPr/uS0RE5IzV+PBds/swB/KKGdy5sa9LERERqRI1PnwXpO0DYJDu7xURkTqixofvwrT9\nJLSoT+PIEF+XIiIiUiVqdPjmFJbw8/aDGtVKRETqlBodvj9szqLUYXV/r4iI1Ck1OnwXpGUSUS+Q\n3q0b+roUERGRKlNjw9day8K0TAZ0bEy9oBpbpoiIiMdqbKpt3Z/HzoMFOuQsIiJ1To0N3wVp5UNK\n6mIrERGpY2ps+C5My6Rd4whax4T7uhQREZEqVSPDt7CkjB+3HGBwJ41qJSIidU+NDN/l6QcpKCnT\n+V4REamTamT4LtyYSXCg4az2Mb4uRUREpMrVzPBNy6Rv20ZEhAT5uhQREZEqV+PCN+NwIev35uiQ\ns4iI1Fluha8x5nZjzHJjTJExZnp1FvTN2gwAjecsIiJ1lrvHdXcDTwLnAmHVVUxJmYN/LdhMz5bR\ndG0WVV1vIyIi4lNu9XyttZ9aaz8DsqqzmE9/3snOgwXcNaITxpjqfCsRERGfqTHnfEvKHLwyfxM9\nWkYzNL6Jr8sRERGpNsZa6/7CxjwJtLTWjqvg9fHAeIDY2NjkWbNmub3thTtLePu3Yu7uHUJSE/+8\nyjk3N5fIyEhfl1GrqM08pzbznNrMc/7YZkOHDl1hre3jzrJVGr5Hi4+Ptxs2bHBruyVlDoY9m0qD\nsHrMuf0cvz3knJqaSkpKiq/LqFXUZp5Tm3lObeY5f2wzY4zb4VsjDjvP/mUXOw4UcLfO9YqIiB9w\n6/iuMSaofNlAINAYEwqUWmtLz7SAkjIHr8zbRGKLaIZ10bleERGp+9zt+T4EFAAPAL8v//qhqihg\n9i+72H4gn7uGq9crIiL+wa2er7V2MjC5qt+8tMzBP+dvIqFFfYZ3Va9XRET8g0/P+c7+ZRfbsvK5\na3hn9XpFRMRv+Cx8S8vv6+3evD4j1OsVERE/4rPw/Wzl7vJer871ioiIf/FJ+JaWOXh53ka6NavP\nyG5xvihBRETEZ3wSvp+X93p1X6+IiPgjr4ever0iIuLvvB6+c1btJj0rXzMXiYiI3/Jq+Dp7vZvo\n1qw+o9TrFRERP+XV8J2zajdb9+dxp65wFhERP+a18C0tH8O5q3q9IiLi57wWvl+s3s2W/XncNbwj\nAQHq9YqIiP/ySviWOSwvf7+JLk2jGNWtqTfeUkREpMbySvh+scrZ6717RCf1ekVExO9Ve/iWOSwv\nzduoXq+IiEi5ag/fuat3syUzj7uGq9crIiIC1Ry+ZQ7Li987e73ndlevV0REBKo5fI/0eu9Ur1dE\nRMSlWsP3pe83Eh8XxXnq9YqIiLhUW/jmlVg2q9crIiJygmoL3+wiS+e4SM5PUK9XRETkaG6FrzGm\nkTFmtjEmzxizzRhzbWXrlDjgruGd1esVERE5TpCby/0TKAbigCTg38aYVdbaNRWtEByAer0iIiIn\nUWnP1xgTAVwOPGytzbXWLgbmANedar2YsAD1ekVERE7CncPOnYFSa23aUc+tArqfaqXQwDMpS0RE\npO5y57BzJHD4uOcOAVHHL2iMGQ+ML/+2yBjz25mV53caA/t9XUQtozbznNrMc2ozz/ljm7Vxd0F3\nwjcXqH/cc/WBnOMXtNa+AbwBYIxZbq3t424hojY7HWozz6nNPKc285za7NTcOeycBgQZYzod9VxP\noMKLrURERKRilYavtTYP+BR43BgTYYw5B7gEeLe6ixMREamL3B1k41YgDNgHvA9MPNVtRuXeOJPC\n/JTazHNqM8+pzTynNvOc2uwUjLXW1zWIiIj4lWqfz1dERESOpfAVERHxsioP39MZB9rfGWNSjTGF\nxpjc8scGX9dU0xhjbjfGLDfGFBljph/32nBjzHpjTL4xZr4xxu177eqyitrMGNPWGGOP2t9yjTEP\n+7DUGsEYE2KMmVr+eyvHGLPSGHP+Ua9rPzvOqdpM+9mpuTu2syc8HgdaALjdWvuWr4uowXYDTwLn\n4rz4DwBjTGOcV+PfDHwBPAF8CJzlgxprmpO22VEaWGtLvVtSjRYE7ACGANuBC4BZxphEnOMdaD87\n0ana7AjtZydRpeF71DjQCdbaXGCxMebIONAPVOV7iX+x1n4KYIzpA7Q86qXLgDXW2o/KX58M7DfG\ndLHWrvd6oTXIKdpMTqL8tsrJRz011xizFUgGYtB+doJK2myFT4qqJar6sPNpjQMtAPzNGLPfGPNf\nY0yKr4upRbrj3McA1y+DzWifc8c2Y8xOY8y08iMIchRjTBzO32lr0H7mluPa7AjtZydR1eHr9jjQ\ncow/A+2BFjjvjfvCGNPBtyXVGpE497GjaZ87tf1AX5zj0CbjbKuZPq2ohjHGBONskxnlPVvtZ5U4\nSZtpPzuFqg5ft8eBlv+x1v5krc2x1hZZa2cA/8V57kQqp33OQ+VTgy631pZaazOA24FRxhgFCWCM\nCcA5gl8xzrYB7WendLI20352alUdvhoHumpYQJMhu2cNzn0McF130AHtc544MtKO3996aIwxwFSc\nF4xebq0tKX9J+1kFTtFmx9N+dpQqbQSNA+05Y0wDY8y5xphQY0yQMWYsMBj4yte11STlbRMKBAKB\nR9oLmA0kGGMuL3/9EWC1P18Ec0RFbWaM6W+MiTfGBBhjYoCXgFRr7fGHVf3Ra0BX4GJrbcFRz2s/\nq9hJ20z7WSWstVX6ABoBnwF5OC89v7aq36MuPYBYYBnOw1fZwI/ASF/XVdMeOK+otMc9Jpe/NgJY\nDxQAqUBbX9dbEx4VtRlwDbC1/P/oHuAdoKmv6/X1A+e5SQsU4jzMfOQxtvx17WcetJn2s1M/NLaz\niIiIl+nYu4iIiJcpfEVERLxM4SsiIuJlCl8REREvU/iKiIh4mcJXRETEyxS+IiIiXqbwFRER8TKF\nr4iIiJf9f1mcff1umrL5AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 576x360 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JpFS1ygLgRlb",
        "colab_type": "text"
      },
      "source": [
        "## Encoder \n",
        "\n",
        "Input Dimension = M \\\\\n",
        "Out Dimension = Channel Dimension = 2 * dim_n "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "2SI75bbcJ0bg",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 196
        },
        "outputId": "fd1ccc0c-0b2c-4de6-b7a9-8249bc943d28"
      },
      "source": [
        "EncIn = tf.keras.layers.Input(shape=(M,))#, dtype= tf.int32)\n",
        "e1 = tf.keras.layers.Dense(dim_n, activation=None)\n",
        "e2 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "EncOut = tf.keras.layers.Lambda(lambda x: x/tf.sqrt(2*tf.reduce_mean(tf.square(x))))\n",
        "GenIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x,(tf.shape(x)[0],-1)))\n",
        "#GenOut = tf.keras.layers.Lambda(generator)\n",
        "DecIn = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,int(n/2),2]))\n",
        "d1 = tf.keras.layers.Lambda(lambda x:tf.reshape(x, shape=[-1,n]))\n",
        "d2 = tf.keras.layers.Dense(M, activation='relu')\n",
        "DecOut = tf.keras.layers.Dense(M, activation='softmax')\n",
        "\n",
        "\n",
        "encoder =tf.keras.models.Sequential([EncIn,e1])    #Ohne reshape\n",
        "decoder =tf.keras.models.Sequential([d2,DecOut]) # Ohne reshape\n",
        "\n",
        "encoder.summary()"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"sequential_1\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_3 (Dense)              (None, 3)                 15        \n",
            "=================================================================\n",
            "Total params: 15\n",
            "Trainable params: 15\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dQEszTQwhl-R",
        "colab_type": "text"
      },
      "source": [
        "### MI - Loss\n",
        "\n",
        "m = Massege\n",
        "x = AE(m)\n",
        "y = Channel(x)\n",
        "\n",
        "Loss = MI(x,y)"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Tuf3BQ1dhl1F",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 482
        },
        "outputId": "b09b9413-7067-48ec-eb6e-bb71f8f1c117"
      },
      "source": [
        "#MI_mod.trainable = False\n",
        "\n",
        "MI_mod.summary()\n",
        "\n",
        "def MI_loss(x,y):\n",
        "  loss = -MI_mod([x,y])\n",
        "  return loss\n",
        "\n",
        "\n",
        "\n",
        "\n",
        "def real_channel(x):\n",
        "    # Black-box Channel\n",
        "    #AWGN\n",
        "    return x + np.random.normal(0., np.sqrt(SIGNAL_NOISE), [SAMPLE_SIZE, dim_n])\n",
        "  "
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Model: \"model\"\n",
            "__________________________________________________________________________________________________\n",
            "Layer (type)                    Output Shape         Param #     Connected to                     \n",
            "==================================================================================================\n",
            "input_1 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "input_2 (InputLayer)            [(None, 6)]          0                                            \n",
            "__________________________________________________________________________________________________\n",
            "sequential (Sequential)         (None, 1)            1171        input_1[0][0]                    \n",
            "                                                                 input_2[0][0]                    \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Exp (TensorFlowOpLa [(None, 1)]          0           sequential[1][0]                 \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Mean_1 (TensorFlowO [()]                 0           tf_op_layer_Exp[0][0]            \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Mean (TensorFlowOpL [()]                 0           sequential[0][0]                 \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_Log (TensorFlowOpLa [()]                 0           tf_op_layer_Mean_1[0][0]         \n",
            "__________________________________________________________________________________________________\n",
            "tf_op_layer_sub (TensorFlowOpLa [()]                 0           tf_op_layer_Mean[0][0]           \n",
            "                                                                 tf_op_layer_Log[0][0]            \n",
            "==================================================================================================\n",
            "Total params: 1,171\n",
            "Trainable params: 1,171\n",
            "Non-trainable params: 0\n",
            "__________________________________________________________________________________________________\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "zB73RkszjT9j",
        "colab_type": "text"
      },
      "source": [
        "## Training Function"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "_sUbcMOpjUGr",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "#@tf.function\n",
        "def train_step(m): #epoch, steps_per_epoches , batch_size, generator, discriminator):\n",
        "    with tf.GradientTape() as enc_tape:\n",
        "      x = encoder(m, training = True)\n",
        "      y = real_channel(x)\n",
        "      \n",
        "      tf.print(x.shape)\n",
        "      tf.print(y.shape)\n",
        "      \n",
        "      x_sample1, x_sample2 = tf.split(x, num_or_size_splits=2)\n",
        "      y_sample1, y_sample2 = tf.split(y, num_or_size_splits=2)\n",
        "      joint_sample = tf.concat([x_sample1, y_sample1], axis=1)\n",
        "      marg_sample = tf.concat([x_sample2, y_sample1], axis=1)\n",
        "      \n",
        "      \n",
        "      \n",
        "      \n",
        "      enc_loss = MI_loss((joint_sample, marg_sample), x)\n",
        "      \n",
        "      #tf.print(disc_loss,gen_loss)\n",
        "      \n",
        "      if tf.math.is_nan(enc_loss) == False:\n",
        "        gradients_of_encoder = disc_tape.gradient(enc_loss, encoder.trainable_variables)\n",
        "        discriminator_optimizer.apply_gradients(zip(gradients_of_encode, encoder.trainable_variables))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "D4N-p5Nbk_2f",
        "colab_type": "text"
      },
      "source": [
        "### Trainings Data"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gofvRVrTk_9L",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def generate_data_vector(length):\n",
        "  random_vector = tf.random.uniform(shape =(length,),minval=0,maxval=M, dtype=tf.dtypes.int32 ,seed=None,name=None)\n",
        "  random_hot_one_vector = tf.one_hot(random_vector, depth=M,on_value=1, off_value=0,axis=-1)\n",
        "  tf.print(random_hot_one_vector.shape)\n",
        "  return random_hot_one_vector\n",
        "\n",
        "#data, test_data = generate_data_vector(10000000), generate_data_vector(10000)\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "K0NeuK21lm4F",
        "colab_type": "text"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "cfFUT6DwlmvJ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "epochs = 500\n",
        "batch_size = SAMPLE_SIZE"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xVXMlZzTlz8i",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def train(epochs, batch_size):\n",
        "  start = time.time()\n",
        "  counter = 0\n",
        "  epoch = 0\n",
        "  m = generate_data_vector(batch_size)\n",
        "  for epoch in range(epochs):\n",
        "    counter += 1\n",
        "    train_step(m)\n",
        "    if counter%100 == 0:\n",
        "    #print ('Time for epoch {} is {} sec,'.format(epoch + 1, time.time()-start))\n",
        "      tf.print ('Time for epoch {},'.format(epoch + 1))\n",
        "      \n",
        "  #tf.saved_model.save(encoder,'/tmp/saved_model/')\n",
        "  #tf.print ('Time for the training is {} sec,'.format( time.time()-start))"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wZQLuwHHl1Gj",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "outputId": "4813c4f0-3294-472a-d09f-4d8445be5a77"
      },
      "source": [
        "%%time\n",
        "train(epochs , batch_size)\n",
        "encoder.summary()"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "TensorShape([18000, 4])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "Time for epoch 100,\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "Time for epoch 200,\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "Time for epoch 300,\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "Time for epoch 400,\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "TensorShape([18000, 3])\n",
            "Time for epoch 500,\n",
            "Model: \"sequential_1\"\n",
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "dense_3 (Dense)              (None, 3)                 15        \n",
            "=================================================================\n",
            "Total params: 15\n",
            "Trainable params: 15\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "CPU times: user 12.4 s, sys: 671 ms, total: 13.1 s\n",
            "Wall time: 12.3 s\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "z-ELSw_ZnCXT",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}